# 引用传递和地址传递

print('===尝试不可变类型，函数内部修改为不可变类型')
# a = 100
def change(num):
    # print(a)
    print(id(num)) # python 当中只有地址传递，没有值传递。
    print(num)
    num = 1000 # 这里是不可变类型
    print(num)
    print(id(num))  # 不可变类型 就出现了新的 id

b = 10
print(id(b))
change(b)
print(b) # 这里的值不是可变类型，因此函数内部尽管是地址引用，但是函数内的改变仍然不起作用，不会更改掉变量的值。

print('====尝试可变类型，但是函数内部是更改为不可变类型')
c = [1, 2, 3]
print(id(c))
change(c)
print(c) # 因为修改的新的 不可变值，因此这里的变量的大小没有发生变化

def change2(num):
    print(id(num))
    print(num)
    # num = [4, 5, 6] 
    num.append(666)
    print(num)
    print(id(num)) # id发生变化，可见这里是新的值。已经不在是原来的num了。

print('====尝试给可变类型，函数内部修改可变类型')
c = [1, 2, 3]
print(id(c))
change2(c)
print(c) # 因为这里修改的是可变类型，所以函数内部修改，就改变了这个值

def change3(num):
    print(id(num))
    print(num)
    num = [4, 5, 6] 
    print(num)
    print(id(num)) # id发生变化，可见这里是新的值。已经不在是原来的num了。

print('====尝试给可变类型，函数内部修改可变类型')
c = [1, 2, 3]
print(id(c))
change3(c)
print(c) # 因为这里修改的是可变类型，但是采用的赋值语句，因此也是不能够更改数值的大小的，相当于又 重新使用了一个值，并没有使用原来的值。

